package com.ybear.ybutils.utils;

import androidx.annotation.NonNull;

import java.util.ArrayList;
import java.util.ConcurrentModificationException;
import java.util.List;

/**
 * 数据观察者管理器 - DataObserverManage
 * 通过 setResult 设置一个通知，它会将设置的通知回调给注册者，即 registerResult
 */
public class DOM {
    public interface OnResultListener { void onResult(int id, Object data); }

    private List<OnResultListener> listenerList = new ArrayList<>();

    private DOM() { }
    public static DOM getInstance() { return HANDLER.I; }
    private static final class HANDLER { private static final DOM I = new DOM(); }

    /**
     * 设置结果
     * 这个结果会通知所有注册的监听器
     * @param id    id
     * @param data  data
     */
    public synchronized void setResult(final int id, final Object data) {
        try {
            for( OnResultListener l : listenerList ) {
                if( l != null ) l.onResult(id, data);
            }
        } catch (ConcurrentModificationException e) {
            e.printStackTrace();
        }
    }

    /**
     * 设置结果
     * @param id    id
     */
    public synchronized void setResult(int id) {
        setResult(id, null);
    }

    /**
     * 注册监听器
     * @param mOnResultListener     注册的监听器
     * @return                      是否注册成功
     */
    public boolean registerResult(@NonNull OnResultListener mOnResultListener) {
        return listenerList.add(mOnResultListener);
    }

    /**
     * 解除注册监听器
     * @param mOnResultListener     解除的监听器
     * @return                      是否解除成功
     */
    public boolean unRegisterResult(@NonNull OnResultListener mOnResultListener) {
        return listenerList.remove(mOnResultListener);
    }

    public void clear() { listenerList.clear(); }
}
